package cn.tedu.ticket;
/**本类通过继承的方式实现多线程售票案例*/
//需求:4个窗口,模拟售票,同时售票共计100张,售完为止
public class TicketThread {
    public static void main(String[] args) {
        TicketT t1=new TicketT();
        TicketT t2=new TicketT();
        TicketT t3=new TicketT();
        TicketT t4=new TicketT();
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
class TicketT extends Thread{
//    int tickets=100;//共计100张票
    //出现了售卖400张票的情况,原因是没new一次对象,就有100张票
    //解决方案:需要把票数变为静态资源,被本类的所有对象共享
    static int tickets=100;
@Override
    public void run() {
        //通过死循环卖票,只要有票,就一直运行
        while (true){
            try {
                //让程序休眠10ms--休眠中断阻塞
                /**一个程序如果经受住了休眠的考验,才能说明没有数据安全隐患
                 * 我们手动添加休眠方法,是为了更快的暴露出程序中可能出现的问题
                 * 问题1:重卖:同一张票卖给了多个人
                 * 问题2:超卖:超出了实际的票数,出现了0,-1,-2这样的情况*/
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //打印当前正在卖票的线程名称&票数-1
            System.out.println(getName()+"="+tickets--);
            //做判断,如果没票就退出循环
            if (tickets<=0)break;//注意,死循环一定要设置出口
            //如果if判断语句后只有一句话,大括号可以省略不写
        }
    }
}